﻿using System;

namespace Scommesse.Model
{
    [Serializable]
    public class ScommessaController
    {
        public ScommessaController(BetCard betCard, Scommessa scommessa)
        {
            BetCard = betCard;
            Scommessa = scommessa;
        }

        public Scommessa Scommessa { get; set; }

        public BetCard BetCard { get; private set; }

        public void ControllaScommessa()
        {
            // Qui si sfrutta solo il PATTERN STATE
            if (Scommessa.Controllabile())
                // REFLECTION: a seconda del tipo, il controller deve effettuare controlli di tipo diverso
                // prima di poter usare il metodo ControllaScommessa (ancora PATTERN STATE)
                switch (Scommessa.GetType().Name)
                {
                    case "Carrello":
                        if (BetCard.Credito >= Scommessa.Importo)
                        {
                            Scommessa.ControllaScommessa(this);
                            BetCard.Credito -= Scommessa.Importo;
                            BetCard.AddScommessa(this);
                        }
                        else
                            throw new Exception("credito non sufficiente");
                        break;
                    case "ScommessaConfermata":
                        Scommessa.ControllaScommessa(this);
                        if (((ScommessaConfermata)Scommessa).Stato.Equals(StatoScommessaConfermata.Vinta))
                            BetCard.RicaricaCredito(Scommessa.TotaleVincita);
                        break;
                }
            else throw new Exception("la scommessa non è controllabile");
        }
    }
}